package config.java;

import org.apache.commons.logging.Log;

/**
 * <ul>
 * 本模块实现以下功能：
 * <li>统一管理多个配置文件，只需要给配置文件指定别名</li>
 * <li>可以自动载入修改后的配置文件</li>
 * <li>可以管理不同类型的配置文件，如property,xml</li>
 * </ul>
 * 
 * 本模块支持以下格式的配置文件<br>
 * 1.property。比如：
 * 
 * <pre>
 * config-key0=value0
 * config-key1=value1
 * config-key2=value2
 * </pre>
 * 这种格式在设置配置文件时采用propertyConfig的方式。<br>
 * 2.xml。xml有二种格式支持，一种是最简单的格式，比如：
 * 
 * <pre>
 * &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
 *  &lt;root&gt;
 *  	&lt;config-key0&gt;value0&lt;/config-key0&gt;
 *  	&lt;config-key1&gt;value1&lt;/config-key1&gt;
 *  	&lt;config-key2&gt;value2&lt;/config-key2&gt;
 *  &lt;/root&gt;
 * </pre>
 * 这种格式在设置配置文件时采用xmlConfig的方式。<br>
 * 另一种是java的xml格式的property配置文件，比如：
 * 
 * <pre>
 * &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
 *  &lt;!DOCTYPE properties SYSTEM &quot;http://java.sun.com/dtd/properties.dtd&quot;&gt;
 *  &lt;properties&gt;
 *  	&lt;entry key=&quot;config-key0&quot;&gt;value0&lt;/config-key0&gt;
 *  	&lt;entry key=&quot;config-key1&quot;&gt;value1&lt;/config-key1&gt;
 *  	&lt;entry key=&quot;config-key2&quot;&gt;value2&lt;/config-key2&gt;
 *  &lt;/properties&gt;
 * </pre>
 * 这种格式在设置配置文件时采用propertyXmlConfig的方式。
 * @author liao
 * 
 */

public class Config {

	/**
	 * 设置日志输出的log<br>
	 * 可以指定日志的输出，这个输出是log4j的输出，如果没有指定，则会直接输出到控制台<br>
	 * 如果要指定输出，必须在设置配置文件之前进行
	 * 
	 * @param logger
	 */
	public void setLoger(Log logger) {
		ConfigLog.setLog(logger);
	}

	/**
	 * 取一个配置文件中某个KEY的值
	 * 
	 * @param alias 配置文件别名
	 * @param key 配置文件的KEY
	 * @return 如果配置文件存在，且有这个KEY，返回这个KEY的值，否则返回null
	 */
	public String getValue(String alias, String key) {
		ConfigValue value = ConfigValue.getInstance();
		return value.getValue(alias, key);
	}

	/**
	 * 取配置文件中某个KEY的值<br>
	 * 此方法只适合于只有一个配置文件，且在设置配置文件时没有指定别名的情况，否则有可能不能正确取到值
	 * 
	 * @param key 配置文件中的KEY
	 * @return 如果配置文件有这个KEY，返回这个KEY的值，否则返回null
	 */
	public String getValue(String key) {
		ConfigValue value = ConfigValue.getInstance();
		return value.getValue("defAlias", key);
	}

	/**
	 * 取一个配置文件中某个KEY的值，如果配置文件不存在，某配置中的KEY没有，会返回指定的默认值
	 * 
	 * @param alias 配置文件别名
	 * @param key 配置文件中的KEY
	 * @param def 默认值，在取不到值时以这个默认值代替
	 * @return 如果配置文件存在，且在配置文件中KEY有效，返回这个KEY的值，否则返回默认值
	 */
	public String getValueByDefault(String alias, String key, String def) {
		ConfigValue value = ConfigValue.getInstance();
		return value.getValue(alias, key, def);
	}

	/**
	 * 取配置文件中某个KEY的值，如果KEY不存在，返回指定的默认值<br>
	 * 本方法只适应于只有一个配置文件，且在设置配置文件时没有指定配置文件的别名，否则有可能不能正确取到值
	 * 
	 * @param key 配置文件的KEY
	 * @param def 默认值，在取不到值时以这个默认值代替
	 * @return 如果配置文件中KEY有效，返回这个KEY的值，否则返回默认值
	 */
	public String getValueByDefault(String key, String def) {
		ConfigValue value = ConfigValue.getInstance();
		return value.getValue("defAlias", key, def);
	}

	/**
	 * 设置以property形式的配置文件，并为这个配置文件指定一个别名
	 * 
	 * @param alias 配置文件别名，这个别名在以后取这个配置文件的KEY值时需要使用
	 * @param configFile 配置文件名，包括文件路径
	 */
	public void propertyConfig(String alias, String configFile) {
		PropertyConfig config = new PropertyConfig();
		config.parse(alias, configFile);
	}

	/**
	 * 设置以property形式的配置文件<br>
	 * 以这个方法设置的配置文件，在取配置文件的KEY值时<font color=red>必须</font>用getValue(String
	 * key)方法来取
	 * 
	 * @param configFile 配置文件名，包括文件路径
	 */
	public void propertyConfig(String configFile) {
		PropertyConfig config = new PropertyConfig();
		config.parse(configFile);
	}

	/**
	 * 设置以property形式的配置文件，并为这个配置文件指定一个别名，同时监测这个配置文件，当发现这个配置文件有变化时，重新载入配置文件
	 * 
	 * @param alias 配置文件别名
	 * @param configFile 配置文件名，包括文件路径
	 * @param delay 监测时长，单位为毫秒，最小不能小于1000,否则以1000代替
	 */
	public void propertyConfigAndWatch(String alias, String configFile,
			long delay) {
		PropertyConfig config = new PropertyConfig();
		config.parseAndWatch(alias, configFile, delay);
	}

	/**
	 * 设置以property形式的配置文件，并为这个配置文件指定一个别名，同时监测这个配置文件，当发现这个配置文件有变化时，重新载入配置文件<br>
	 * 监测时长为默认的60秒
	 * 
	 * @param alias 配置文件别名
	 * @param configFile 配置文件名，包括文件路径
	 */
	public void propertyConfigAndWatch(String alias, String configFile) {
		PropertyConfig config = new PropertyConfig();
		config.parseAndWatch(alias, configFile);
	}

	/**
	 * 设置以property形式的配置文件，同时监测这个配置文件，当发现这个配置文件有变化时，重新载入配置文件<br>
	 * 以这个方法设置的配置文件，在取配置文件的KEY值时<font color=red>必须</font>用getValue(String
	 * key)方法来取
	 * 
	 * @param configFile 配置文件名，包括文件路径
	 * @param delay 监测时长，单位为毫秒，最小不能小于1000,否则以1000代替
	 */
	public void propertyConfigAndWatch(String configFile, long delay) {
		PropertyConfig config = new PropertyConfig();
		config.parseAndWatch("defAlias", configFile, delay);
	}

	/**
	 * 设置以property形式的配置文件，同时监测这个配置文件，当发现这个配置文件有变化时，重新载入配置文件<br>
	 * 以这个方法设置的配置文件，在取配置文件的KEY值时<font color=red>必须</font>用getValue(String
	 * key)方法来取<br>
	 * 监测时长为默认的60秒
	 * 
	 * @param configFile 配置文件名，包括文件路径
	 */
	public void propertyConfigAndWatch(String configFile) {
		PropertyConfig config = new PropertyConfig();
		config.parseAndWatch(configFile);
	}

	/**
	 * 设置以xml形式的配置文件，并为配置文件指定一个别名
	 * 
	 * @param alias 配置文件别名
	 * @param configFile 配置文件名，包括文件路径
	 */
	public void xmlConfig(String alias, String configFile) {
		XmlConfig config = new XmlConfig();
		config.parse(alias, configFile);
	}

	/**
	 * 设置以xml形式的配置文件<br>
	 * 以这个方法设置的配置文件，在取配置文件的KEY值时<font color=red>必须</font>用getValue(String
	 * key)方法来取
	 * 
	 * @param configFile 配置文件名，包括文件路径
	 */
	public void xmlConfig(String configFile) {
		XmlConfig config = new XmlConfig();
		config.parse(configFile);
	}

	/**
	 * 设置以xml形式的配置文件，并为配置文件指定别名，同时监测这个配置文件，如果配置文件修改，则重新载入
	 * 
	 * @param alias 配置文件别名
	 * @param configFile 配置文件名，包括文件路径
	 * @param delay 监测时长，单位为毫秒，最小不能小于1000,否则以1000代替
	 */
	public void xmlConfigAndWatch(String alias, String configFile, long delay) {
		XmlConfig config = new XmlConfig();
		config.parseAndWatch(alias, configFile, delay);
	}

	/**
	 * 设置以xml形式配置文件，同时监测这个配置文件，如果配置文件修改，则重新载入配置文件
	 * 
	 * @param configFile 配置文件名，包括文件路径
	 * @param delay 监测时长，单位为毫秒，最小不能小于1000,否则以1000代替
	 */
	public void xmlConfigAndWatch(String configFile, long delay) {
		XmlConfig config = new XmlConfig();
		config.parseAndWatch("defAlias", configFile, delay);
	}

	/**
	 * 设置以xml形式配置文件，同时监测这个配置文件，如果配置文件修改，则重新载入配置文件<br>
	 * 监测时长为60秒
	 * 
	 * @param alias 配置文件别名
	 * @param configFile 配置文件名，包括文件路径
	 */
	public void xmlConfigAndWatch(String alias, String configFile) {
		XmlConfig config = new XmlConfig();
		config.parseAndWatch(alias, configFile);
	}

	/**
	 * 设置以xml形式配置文件，同时监测这个配置文件，如果配置文件修改，则重新载入配置文件<br>
	 * 监测时长为60秒
	 * 
	 * @param configFile 配置文件名，包括文件路径
	 */
	public void xmlConfigAndWatch(String configFile) {
		XmlConfig config = new XmlConfig();
		config.parseAndWatch(configFile);
	}

	/**
	 * 设置以xml格式，但遵照java的property要求的配置文件，并为配置文件指定别名
	 * 
	 * @param alias 配置文件别名
	 * @param configFile 配置文件名，包括文件路径
	 */
	public void propertyXmlConfig(String alias, String configFile) {
		PropertyXmlConfig config = new PropertyXmlConfig();
		config.parse(alias, configFile);
	}

	/**
	 * 设置以xml格式，但遵照java的property要求的配置文件<br>
	 * 以这个方法设置的配置文件，在取配置文件的KEY值时<font color=red>必须</font>用getValue(String
	 * key)方法来取
	 * 
	 * @param configFile 配置文件名，包括文件路径
	 */
	public void propertyXmlConfig(String configFile) {
		PropertyXmlConfig config = new PropertyXmlConfig();
		config.parse(configFile);
	}

	/**
	 * 设置以xml格式，但遵照java的property要求的配置文件，并为配置文件指定别名，同时监测这个配置文件，如果配置文件修改，则重新载入配置文件
	 * 
	 * @param alias 配置文件别名
	 * @param configFile 配置文件名
	 * @param delay 监测时长，单位为毫秒。最小不能小于1000,否则以1000代替
	 */
	public void propertyXmlConfigAndWatch(String alias, String configFile,
			long delay) {
		PropertyXmlConfig config = new PropertyXmlConfig();
		config.parseAndWatch(alias, configFile, delay);
	}

	/**
	 * 设置以xml格式，但遵照java的property要求的配置文件，并为配置文件指定别名，同时监测这个配置文件，如果配置文件修改，则重新载入配置文件<br>
	 * 监测时长为60秒
	 * 
	 * @param alias 配置文件别名
	 * @param configFile 配置文件名，包括文件路径
	 */
	public void propertyXmlConfigAndWatch(String alias, String configFile) {
		PropertyXmlConfig config = new PropertyXmlConfig();
		config.parseAndWatch(alias, configFile);
	}

	/**
	 * 设置以xml格式，但遵照java的property要求的配置文件，同时监测这个配置文件，如果配置文件修改，则重新载入配置文件<br>
	 * 监测时长为60秒
	 * 
	 * @param configFile 配置文件名，包括文件路径
	 */
	public void propertyXmlConfigAndWatch(String configFile) {
		PropertyXmlConfig config = new PropertyXmlConfig();
		config.parseAndWatch(configFile);
	}

	/**
	 * 设置以xml格式，但遵照java的property要求的配置文件，同时监测这个配置文件，如果配置文件修改，则重新载入配置文件<br>
	 * 
	 * @param configFile 配置文件名，包括文件路径
	 * @param delay 监测时长，单位为毫秒，最小不能小于1000,否则以1000代替
	 */
	public void propertyXmlConfigAndWatch(String configFile, long delay) {
		PropertyXmlConfig config = new PropertyXmlConfig();
		config.parseAndWatch("defAlias", configFile, delay);
	}

}
